package com.zhuhjay.common.base.model.domain.server;

import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.zhuhjay.common.base.constant.TimeConstant;
import lombok.Data;

import java.lang.management.ManagementFactory;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;

/**
 * @author ZhuHJay
 * @date 2023/2/12 22:38
 */
@Data
public class Jvm {
    /** 当前JVM占用的内存总数 Mb */
    private double total;

    /** JVM最大可用内存总数 Mb */
    private double max;

    /** JVM空闲内存 Mb */
    private double free;

    /** JVM总线程数 */
    private int threadCount;

    /** JDK版本 */
    private String version;

    /** JDK路径 */
    private String home;

    private static String args;
    static {
        // 将运行参数中的 自定义私密信息 隐藏
        args = ManagementFactory.getRuntimeMXBean().getInputArguments().toString();
        ReUtil.findAll("-D.*?(?=PASSWD|IP|PORT|ID|KEY|SECRET).*?=(.*?),", args, 1, new ArrayList<>())
                // 过滤掉空值
                .stream().filter(StrUtil::isNotBlank)
                .forEach(data -> args = args.replace(data, "******"));
    }

    /** 获取JDK名称 */
    public String getName() {
        return ManagementFactory.getRuntimeMXBean().getVmName();
    }

    /** 启动时间 */
    public Date getStartTime() {
        return new Date(ManagementFactory.getRuntimeMXBean().getStartTime());
    }

    /** 运行参数 */
    public String getInputArgs() {
        return args;
    }

    /** 运行时间 */
    public String getRuntime() {
        long startTime = ManagementFactory.getRuntimeMXBean().getStartTime();
        LocalDateTime start = LocalDateTimeUtil.of(new Date(startTime));
        LocalDateTime now = LocalDateTime.now();
        // 计算两个时间的差距
        long div = Duration.between(start, now).toMillis();
        return String.format(
                "%d天%d时%d分",
                div / TimeConstant.DAY,
                div % TimeConstant.DAY / TimeConstant.HOUR,
                div % TimeConstant.DAY % TimeConstant.HOUR / TimeConstant.MINUTE);
    }
}
